package com.cmes.core.json;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.BeanProperty;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.ContextualSerializer;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;

import java.io.IOException;
import java.text.DecimalFormat;

/**
 * 数字格式化序列化器
 * <p>
 * 在对应字段上使用 @JsonFormat 注解，并设置其 pattern 属性，使用 DecimalFormat 的格式
 * <p>
 * DecimalFormat使用示例
 * <pre>
 *
 * 以 3.1415926 为例（圆周率）
 *
 * 格式     | 结果     | 说明
 * ------  | -------- | --------------
 * 0       | 3        | 取一位整数
 * 0.00    | 3.14     | 取一位整数及两位小数
 * 00.000  | 03.142   | 取两位整数及三位小数，整数不足部分以 0 补充
 * #       | 3        | 取所有整数部分
 * #.##%   | 314.16%  | 以百分比方式计数，并取两位小数
 *
 * 以 299792458 为例（光速）
 *
 * 格式       | 结果            | 说明
 * --------- | -----------     | --------------
 * #.#####E0 | 2.99792E8       | 显示为科学计数法，并取五位小数
 * 00.####E0 | 29.9792E7       | 显示为两位整数的科学计数法，并取四位小数
 * ,###      | 299,792,458     | 每三位以逗号进行分隔
 * ,###米/秒 | 299,792,458米/秒 | 将格式嵌入文本
 *
 * </pre>
 *
 * @author Bruce.Gong
 * @since 1.0.0-SNAPSHOT
 */
public class DecimalFormatSerializer<T> extends StdSerializer<T> implements ContextualSerializer {

    protected final DecimalFormat decimalFormat;

    public DecimalFormatSerializer(Class<T> cls, String parttern) {
        super(cls);
        this.decimalFormat = new DecimalFormat(parttern);
    }

    @Override
    public JsonSerializer<T> createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException {
        return this;
    }

    @Override
    public void serialize(T value, JsonGenerator gen, SerializerProvider provider) throws IOException {
        gen.writeString(this.decimalFormat.format(value));
    }

}